最近工作較忙,沒什麼時間來學JS DAY30趁今天比較有空來發一下文~
這次的題目比較沒難度,主要是製作一個常用的頁面下拉滾動效果。
當滾動至導覽列(Nav)時,會將Nav固定在上方,在滾動至Nav之上時,會脫離固定。
如下圖所示:
offsetTop為元素距離頂部的距離
,此處我們先獲取nav距離頂部的距離。
let nav = document.querySelector('#main');
// 在一開始先獲取nav距頂部之高度
let navPosition = nav.offsetTop;
接著增聽scroll事件、resize事件,當滾動時,會呼叫函數進行處理,而視窗大小變動時,會重新獲取一次nav距離頂部的高度。
window.addEventListener('scroll', scrollHandler);
// 當視窗變化,在重新獲取一次
window.addEventListener('resize', () => {
navPosition = nav.offsetTop;
})
接著,為了讓nav能夠固定在上方,我們寫一個fixedMenu的css,並且寫一個能讓白色Logo跑出來的css。
.fixedMenu {
position: fixed;
top: 0;
left: 0;
width: 100%;
}
.fixedMenu .logo {
max-width: 100%;
}
在滾動事件處理這邊,scrollY即是獲取元素從頂部開始所滾動之距離
,此處我們是獲取視窗所滾動之距離,在我們滾動至大於Nav位於頂部之距離時,即觸發將nav固定在上方之處理,反之移除,並且注意,由於我們將nav fixed至上方,故原本body之高度會變少,所以要記得加回去nav本身高度
。
function scrollHandler() {
// 前者為我們可視視窗位於網頁的位置,後者為nav於網頁頂部之距離
// console.log(window.scrollY, nav.offsetTop);
if (window.scrollY >= navPosition) {
nav.classList.add("fixedMenu");
// 由於觸發後,會將nav fixed,也就是會將nav高度從原有body抽離
// 故如不想內容跑掉,就需要再將其高度加回去
document.body.style.paddingTop = nav.offsetHeight + "px";
} else {
// 清除class及padding
nav.classList.remove("fixedMenu");
document.body.style.paddingTop = "";
}
}